﻿using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace AndioDemo.Droid
{
    public class StreamAudioFunctions
    {
        /// <summary>
        /// PCM流转换为WAV流
        /// </summary>
        /// <param name="pcm"></param>
        /// <returns></returns>
        public static Stream WriteWaveHeader(Stream pcm)
        {
            //byte[] headerBytes = new byte[44]; // WAV头部字节数组
            var outStream = new MemoryStream();
            using (BinaryWriter writer = new BinaryWriter(outStream))
            {
                // 写入RIFF标识符
                writer.Write((byte)'R');
                writer.Write((byte)'I');
                writer.Write((byte)'F');
                writer.Write((byte)'F');

                // 写入文件大小（不包括头部）
                int fileSize = (int)pcm.Length;
                writer.Write(fileSize + 36);

                // 写入WAVE标识符
                writer.Write((byte)'W');
                writer.Write((byte)'A');
                writer.Write((byte)'V');
                writer.Write((byte)'E');

                // 写入格式块大小
                writer.Write(18);

                // 写入音频格式类型（PCM）
                writer.Write((short)0x0001);

                // 写入通道数量
                short channels = 2; // 双声道
                writer.Write(channels);

                // 写入每次样本的位深度（以字节计算）
                short bitsPerSample = 16; // 16位
                writer.Write(bitsPerSample);

                // 写入采样率
                int sampleRate = 44100; // 44.1kHz
                writer.Write(sampleRate);

                // 写入平均字节速率（根据位深度、通道数和采样率计算得到）
                int averageByteRate = sampleRate * channels * bitsPerSample / 8;
                writer.Write(averageByteRate);

                // 写入每次样本的字节数（根据位深度计算得到）
                short blockAlign = (short)(channels * bitsPerSample / 8);
                writer.Write(blockAlign);

                // 写入每次样本的位深度（以bit计算）
                short bps = (short)(channels * bitsPerSample);
                writer.Write(bps);

                // 写入数据块标识符
                writer.Write((byte)'d');
                writer.Write((byte)'a');
                writer.Write((byte)'t');
                writer.Write((byte)'a');

                // 写入数据块大小（等于PCM文件大小）
                writer.Write(fileSize);

                // 将PCM文件内容复制到输出流中
                using (BinaryReader reader = new BinaryReader(pcm))
                {
                    while (reader.BaseStream.Position < reader.BaseStream.Length)
                    {
                        writer.Write(reader.ReadByte());
                    }
                }
            }

            return outStream;
        }
    }

}